{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "kO9wt2g3okLS"
   },
   "source": [
    "# Building a Simple Bot with the Rasa Stack\n",
    "![alt text](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTaX3LNhGcAe1HnPZSuWS0oH6af0LJHXcH7If1sQgLCFAT1chNGFg)\n",
    "\n",
    "\n",
    "### Please make a copy of this notebook first!\n",
    "\n",
    "If you're interested in building chatbots or voice apps with the [Rasa Stack](https://rasa.com/products/rasa-stack/), you've come to the right place! \n",
    "In this notebook you'll build a complete chatbot with Rasa Stack, without having to install anything on your computer. \n",
    "\n",
    "Using Colaboratory, everything will get installed in a cloud machine for you, so you can focus on creating an interesting bot. \n",
    "\n",
    "We'll build a relatively simple bot, that just asks you about your mood and tries to cheer you up if you're feeling a bit down. \n",
    "\n",
    "The tutorial consists of three parts:\n",
    "\n",
    "\n",
    "\n",
    "*   Part 1: We'll start with a basic bot that can handle multi-turn dialogues but not understand natural language like \"I'm doing well\"\n",
    "*   Part 2: We'll add the abilitiy to understand natural language so that the bot can generalise to similar inputs that it hasn't seen before\n",
    "*   Part 3: We'll give you further resources so you can build your own.\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "tK5os3OinphP"
   },
   "source": [
    "# Part 1: Build a basic bot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "y4miuS-TqYcn"
   },
   "source": [
    "### Installation\n",
    "First we'll have to install Rasa Core on the server running this notebook. In this first step, your bot won't understand natural language yet. This happens in Step 2. **Run the cell below, this will take a couple of minutes to complete so this is a good time to scroll through the rest of the notebook.**\n",
    "\n",
    "**Make sure to install the correct version. If you want to experiment with the latest master, use**: \n",
    "\n",
    "`!pip install -U git+https://github.com/rasahq/rasa_core.git`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 3607.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 58315.0,
     "status": "ok",
     "timestamp": 1.521575035242E12,
     "user": {
      "displayName": "Ricardo Wölker",
      "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s128",
      "userId": "115384113157413623365"
     },
     "user_tz": 0.0
    },
    "id": "X_2-sKgo_qyl",
    "outputId": "b947c702-75fa-406d-d21d-a691dcb5236d"
   },
   "outputs": [],
   "source": [
    "!pip install rasa_core;\n",
    "\n",
    "import logging, io, json, warnings\n",
    "logging.basicConfig(level=\"INFO\")\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "BBF6Nqi9scQE"
   },
   "source": [
    "### Writing Stories\n",
    "\n",
    "A good place to start is by writing a few stories. These are example conversations that Rasa Core will learn from. \n",
    "\n",
    "The format works like this:\n",
    "\n",
    "A story starts with `##` and you can give it a name. \n",
    "lines that start with `*` are messages sent by the user. Although you don't write the *actual* message, but rather the intent (and the entities) that represent what the user *means*. If you don't know about intents and entities, don't worry! We will talk about them more later. \n",
    "Lines that start with `-` are *actions* taken by your bot. In this case all of our actions are just messages sent back to the user, like `utter_greet`, but in general an action can do anything, including calling an API and interacting with the outside world. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 34.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 568.0,
     "status": "ok",
     "timestamp": 1.521575049982E12,
     "user": {
      "displayName": "Ricardo Wölker",
      "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s128",
      "userId": "115384113157413623365"
     },
     "user_tz": 0.0
    },
    "id": "zamaNW4RsrLe",
    "outputId": "6203e4c3-46a3-4c43-add6-95a70d4a6d50"
   },
   "outputs": [],
   "source": [
    "stories_md = \"\"\"\n",
    "## happy path               <!-- name of the story - just for debugging -->\n",
    "* greet              \n",
    "  - utter_greet\n",
    "* mood_great               <!-- user utterance, in format intent[entities] -->\n",
    "  - utter_happy\n",
    "* mood_affirm\n",
    "  - utter_happy\n",
    "* mood_affirm\n",
    "  - utter_goodbye\n",
    "  \n",
    "  \n",
    "## sad path 1               <!-- this is already the start of the next story -->\n",
    "* greet\n",
    "  - utter_greet             <!-- action the bot should execute -->\n",
    "* mood_unhappy\n",
    "  - utter_cheer_up\n",
    "  - utter_did_that_help\n",
    "* mood_affirm\n",
    "  - utter_happy\n",
    "  \n",
    "  \n",
    "\n",
    "## sad path 2\n",
    "* greet\n",
    "  - utter_greet\n",
    "* mood_unhappy\n",
    "  - utter_cheer_up\n",
    "  - utter_did_that_help\n",
    "* mood_deny\n",
    "  - utter_goodbye\n",
    "  \n",
    "## strange user\n",
    "* mood_affirm\n",
    "  - utter_happy\n",
    "* mood_affirm\n",
    "  - utter_unclear\n",
    "\n",
    "## say goodbye\n",
    "* goodbye\n",
    "  - utter_goodbye\n",
    "\n",
    "\"\"\"\n",
    "\n",
    "%store stories_md > stories.md"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Fs3nOUzBsqrG"
   },
   "source": [
    "### Defining a Domain\n",
    "\n",
    "The domain specifies the universe that your bot lives in. You should list all of the intents and actions that show up in your stories. \n",
    "This is also the place to write templates, which contain the messages your bot can send back"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 34.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 465.0,
     "status": "ok",
     "timestamp": 1.521575053606E12,
     "user": {
      "displayName": "Ricardo Wölker",
      "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s128",
      "userId": "115384113157413623365"
     },
     "user_tz": 0.0
    },
    "id": "WB6eIXVkAOSX",
    "outputId": "566b7c42-3772-4754-df55-19874543108c"
   },
   "outputs": [],
   "source": [
    "domain_yml = \"\"\"\n",
    "intents:\n",
    "  - greet\n",
    "  - goodbye\n",
    "  - mood_affirm\n",
    "  - mood_deny\n",
    "  - mood_great\n",
    "  - mood_unhappy\n",
    "\n",
    "actions:\n",
    "- utter_greet\n",
    "- utter_cheer_up\n",
    "- utter_did_that_help\n",
    "- utter_happy\n",
    "- utter_goodbye\n",
    "- utter_unclear\n",
    "\n",
    "templates:\n",
    "  utter_greet:\n",
    "  - text: \"Hey! How are you?\"\n",
    "\n",
    "  utter_cheer_up:\n",
    "  - text: \"Here is something to cheer you up:\"\n",
    "    image: \"https://i.imgur.com/nGF1K8f.jpg\"\n",
    "\n",
    "  utter_did_that_help:\n",
    "  - text: \"Did that help you?\"\n",
    "\n",
    "  utter_unclear:\n",
    "  - text: \"I am not sure what you are aiming for.\"\n",
    "  \n",
    "  utter_happy:\n",
    "  - text: \"Great carry on!\"\n",
    "\n",
    "  utter_goodbye:\n",
    "  - text: \"Bye\"\n",
    "\"\"\"\n",
    "\n",
    "%store domain_yml > domain.yml"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "zQxY6m6kvlj3"
   },
   "source": [
    "### Training your Dialogue Model\n",
    "\n",
    "Now comes the fun part! We're going to show Rasa Core the stories we wrote above, and train a model on these examples. \n",
    "In this case, the model is a neural network implemented in Keras which learns to predict which action to take next. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 14025.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 12554.0,
     "status": "ok",
     "timestamp": 1.521575068686E12,
     "user": {
      "displayName": "Ricardo Wölker",
      "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s128",
      "userId": "115384113157413623365"
     },
     "user_tz": 0.0
    },
    "id": "PKV49d7tAxmS",
    "outputId": "ccb26bea-5be8-48f7-a88e-d70a6e4a1733"
   },
   "outputs": [],
   "source": [
    "from rasa_core.policies.keras_policy import KerasPolicy\n",
    "from rasa_core.agent import Agent\n",
    "\n",
    "agent = Agent('domain.yml', policies=[KerasPolicy()])\n",
    "training_data = agent.load_data('stories.md')\n",
    "agent.train(\n",
    "        training_data,\n",
    "        validation_split=0.0,\n",
    "        epochs=400\n",
    ")\n",
    "\n",
    "agent.persist('models/dialogue')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ulrX_k50udqr"
   },
   "source": [
    "### Starting up the bot\n",
    "Lets start up the bot!\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     }
    },
    "colab_type": "code",
    "collapsed": true,
    "id": "WRrgpX3-plRS"
   },
   "outputs": [],
   "source": [
    "from rasa_core.agent import Agent\n",
    "agent = Agent.load('models/dialogue')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "BQahZCjV4kWh"
   },
   "source": [
    "### Talking to the bot (no NLU)\n",
    "\n",
    "In this step, we just trained the dialogue model - so basically the conversational flow. So the bot will only understand **structured** input and **no** natural language yet. Go try it out with typing  \"/\" + one of the intents from your domain before, e.g.:\n",
    "\n",
    "/greet\n",
    "\n",
    "/mood_affirm\n",
    "\n",
    "/mood_deny"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 53.0
    },
    "colab_type": "code",
    "id": "cX-YgOE8pmcx",
    "outputId": "085982df-5f16-4783-c0ac-44955d86b236"
   },
   "outputs": [],
   "source": [
    "print(\"Your bot is ready to talk! Type your messages here or send 'stop'\")\n",
    "while True:\n",
    "    a = input()\n",
    "    if a == 'stop':\n",
    "        break\n",
    "    responses = agent.handle_message(a)\n",
    "    for response in responses:\n",
    "        print(response[\"text\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "cNa5KHl1nzhT"
   },
   "source": [
    "# Part 2: Add natural language understanding\n",
    "\n",
    "So far, our bot doesn't understand regular sentences with natural language yet.\n",
    "To do that, we're going to build a language understanding model with Rasa NLU. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "tGtnKfRG34Cd"
   },
   "source": [
    "### Installing NLU\n",
    "We have to install a couple of more things in this notebook here. **Run the cell below** - in the meantime, you can check out the rest of the code.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 7381.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 394577.0,
     "status": "ok",
     "timestamp": 1.521379937327E12,
     "user": {
      "displayName": "Alexander Weidauer",
      "photoUrl": "//lh6.googleusercontent.com/-j4xnI5_PFWA/AAAAAAAAAAI/AAAAAAAAAAo/wPT2w5Bl3xg/s50-c-k-no/photo.jpg",
      "userId": "100444450157165144272"
     },
     "user_tz": -60.0
    },
    "id": "jtt8MXeip1Dp",
    "outputId": "48f7385a-1937-4fa4-ca7d-d49a007f001b"
   },
   "outputs": [],
   "source": [
    "!apt-get -qq install -y graphviz libgraphviz-dev pkg-config && pip install pygraphviz;\n",
    "!pip install rasa_nlu[spacy];\n",
    "!python -m spacy download en;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "GAlnWyGRwcwO"
   },
   "source": [
    "### Language Understanding\n",
    "\n",
    "\n",
    "Lets create some training data here, grouping user messages by their `intent`s. The intent describes what the messages *mean*. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 34.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 864.0,
     "status": "ok",
     "timestamp": 1.521380057973E12,
     "user": {
      "displayName": "Alexander Weidauer",
      "photoUrl": "//lh6.googleusercontent.com/-j4xnI5_PFWA/AAAAAAAAAAI/AAAAAAAAAAo/wPT2w5Bl3xg/s50-c-k-no/photo.jpg",
      "userId": "100444450157165144272"
     },
     "user_tz": -60.0
    },
    "id": "V6KHWT2zeEh5",
    "outputId": "bab4845d-4ebc-4b9b-f8d9-2f701504a9c0"
   },
   "outputs": [],
   "source": [
    "nlu_md = \"\"\"\n",
    "## intent:greet\n",
    "- hey\n",
    "- hello\n",
    "- hi\n",
    "- hello there\n",
    "- good morning\n",
    "- good evening\n",
    "- moin\n",
    "- hey there\n",
    "- let's go\n",
    "- hey dude\n",
    "- goodmorning\n",
    "- goodevening\n",
    "- good afternoon\n",
    "\n",
    "## intent:goodbye\n",
    "- cu\n",
    "- good by\n",
    "- cee you later\n",
    "- good night\n",
    "- good afternoon\n",
    "- bye\n",
    "- goodbye\n",
    "- have a nice day\n",
    "- see you around\n",
    "- bye bye\n",
    "- see you later\n",
    "\n",
    "## intent:mood_affirm\n",
    "- yes\n",
    "- indeed\n",
    "- of course\n",
    "- that sounds good\n",
    "- correct\n",
    "\n",
    "## intent:mood_deny\n",
    "- no\n",
    "- never\n",
    "- I don't think so\n",
    "- don't like that\n",
    "- no way\n",
    "- not really\n",
    "\n",
    "## intent:mood_great\n",
    "- perfect\n",
    "- very good\n",
    "- great\n",
    "- amazing\n",
    "- feeling like a king\n",
    "- wonderful\n",
    "- I am feeling very good\n",
    "- I am great\n",
    "- I am amazing\n",
    "- I am going to save the world\n",
    "- super\n",
    "- extremely good\n",
    "- so so perfect\n",
    "- so good\n",
    "- so perfect\n",
    "\n",
    "## intent:mood_unhappy\n",
    "- my day was horrible\n",
    "- I am sad\n",
    "- I don't feel very well\n",
    "- I am disappointed\n",
    "- super sad\n",
    "- I'm so sad\n",
    "- sad\n",
    "- very sad\n",
    "- unhappy\n",
    "- bad\n",
    "- very bad\n",
    "- awful\n",
    "- terrible\n",
    "- not so good\n",
    "- not very good\n",
    "- extremly sad\n",
    "- so saad\n",
    "- so sad\n",
    "\"\"\"\n",
    "\n",
    "%store nlu_md > nlu.md"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "1xeXgpdwzOAl"
   },
   "source": [
    "### Train the Rasa NLU Model\n",
    "\n",
    "We're going to train a model to recognise these intents, so that when we send a message like \"hello\" to our bot, it will recognise this as a \"greet\" intent."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 377.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 2821.0,
     "status": "ok",
     "timestamp": 1.521380062879E12,
     "user": {
      "displayName": "Alexander Weidauer",
      "photoUrl": "//lh6.googleusercontent.com/-j4xnI5_PFWA/AAAAAAAAAAI/AAAAAAAAAAo/wPT2w5Bl3xg/s50-c-k-no/photo.jpg",
      "userId": "100444450157165144272"
     },
     "user_tz": -60.0
    },
    "id": "qHsAH49OePcM",
    "outputId": "f840c42d-acf2-4fbf-b439-e5a239ffb32b"
   },
   "outputs": [],
   "source": [
    "from rasa_nlu.training_data import load_data\n",
    "from rasa_nlu.config import RasaNLUModelConfig\n",
    "from rasa_nlu.model import Trainer\n",
    "\n",
    "training_data = load_data('nlu.md')\n",
    "pipeline = [{\"name\": \"nlp_spacy\"}, \n",
    "            {\"name\": \"tokenizer_spacy\"}, \n",
    "            {\"name\": \"intent_featurizer_spacy\"},  \n",
    "            {\"name\": \"intent_classifier_sklearn\"}]\n",
    "trainer = Trainer(RasaNLUModelConfig({\"pipeline\": pipeline}))\n",
    "interpreter = trainer.train(training_data)\n",
    "model_directory = trainer.persist('./projects/default/')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "FSjCEdvlzfSR"
   },
   "source": [
    "### Starting up the bot (with NLU)\n",
    "\n",
    "Now that we've trained the dialogue **and** language understanding models and saved them, we can start up an `Agent` which will handle conversations for us. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 34.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 1799.0,
     "status": "ok",
     "timestamp": 1.521380071327E12,
     "user": {
      "displayName": "Alexander Weidauer",
      "photoUrl": "//lh6.googleusercontent.com/-j4xnI5_PFWA/AAAAAAAAAAI/AAAAAAAAAAo/wPT2w5Bl3xg/s50-c-k-no/photo.jpg",
      "userId": "100444450157165144272"
     },
     "user_tz": -60.0
    },
    "id": "Ywxs0ljHgkLm",
    "outputId": "e11a8abd-70f6-41c5-ccd1-a7cba7146ce9"
   },
   "outputs": [],
   "source": [
    "from rasa_core.agent import Agent\n",
    "agent = Agent.load('models/dialogue', interpreter=model_directory)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "5MnGuFRpzzBh"
   },
   "source": [
    "### Talking to the Bot (with NLU)\n",
    "\n",
    "We can start talking to the bot in natural language."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 1340.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 57365.0,
     "status": "error",
     "timestamp": 1.521380132537E12,
     "user": {
      "displayName": "Alexander Weidauer",
      "photoUrl": "//lh6.googleusercontent.com/-j4xnI5_PFWA/AAAAAAAAAAI/AAAAAAAAAAo/wPT2w5Bl3xg/s50-c-k-no/photo.jpg",
      "userId": "100444450157165144272"
     },
     "user_tz": -60.0
    },
    "id": "t_4zHDsgkbno",
    "outputId": "57473fce-7184-45d1-f2b2-470bfc84244e"
   },
   "outputs": [],
   "source": [
    "print(\"Your bot is ready to talk! Type your messages here or send 'stop'\")\n",
    "while True:\n",
    "    a = input()\n",
    "    if a == 'stop':\n",
    "        break\n",
    "    responses = agent.handle_message(a)\n",
    "    for response in responses:\n",
    "        print(response[\"text\"])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "qWALQbCdwGxK"
   },
   "source": [
    "### Pro Tip: Visualising the Training Data\n",
    "\n",
    "You can visualise the stories to get a sense of how the conversations go. This is usually a good way to see if there are any stories which don't make sense\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0.0
     },
     "base_uri": "https://localhost:8080/",
     "height": 895.0
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 2808.0,
     "status": "ok",
     "timestamp": 1.521380138202E12,
     "user": {
      "displayName": "Alexander Weidauer",
      "photoUrl": "//lh6.googleusercontent.com/-j4xnI5_PFWA/AAAAAAAAAAI/AAAAAAAAAAo/wPT2w5Bl3xg/s50-c-k-no/photo.jpg",
      "userId": "100444450157165144272"
     },
     "user_tz": -60.0
    },
    "id": "zl6vtV72BDaV",
    "outputId": "2468f1bf-3fd0-42f0-9338-8f48c8cad3dd"
   },
   "outputs": [],
   "source": [
    "from rasa_core.agent import Agent\n",
    "from IPython.display import Image\n",
    "\n",
    "agent = Agent.load('models/dialogue')\n",
    "agent.visualize(\"stories.md\", \"story_graph.png\", max_history=2)\n",
    "Image(filename=\"story_graph.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "m7VUXU6Cn5R-"
   },
   "source": [
    "# Part 3: Next steps\n",
    "\n",
    "Great job! You've built your first bot that uses Machine Learning to manage dialogues. As a next step, we'd suggest you start building your own bot. Here are a few useful links:\n",
    "\n",
    "\n",
    "\n",
    "*   Install the Rasa Stack on your machine [here](https://core.rasa.ai/installation.html)\n",
    "*   Learn how to bootstrap training data with the [interactive learning tutorial](https://core.rasa.ai/tutorial_interactive_learning.html)\n",
    "*   Connect to the community in our [Gitter Chat](https://gitter.im/RasaHQ/rasa_core)\n",
    "\n",
    "\n",
    "\n",
    "---\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "*Any feedback for this tutorial?* Please shoot us an email at hi@rasa.com"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [
    "y4miuS-TqYcn",
    "BBF6Nqi9scQE",
    "Fs3nOUzBsqrG",
    "5MnGuFRpzzBh"
   ],
   "default_view": {},
   "name": "Building a Simple Bot with Rasa Stack - Tutorial",
   "provenance": [
    {
     "file_id": "1GutDkDXmfU-nRzNH7Pxxx8YpdvLUw9LO",
     "timestamp": 1.521183725373E12
    }
   ],
   "toc_visible": true,
   "version": "0.3.2",
   "views": {}
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
